package com.atguigu.srb.common.utils;

import java.util.regex.Pattern;

/**
 * 使用正则表达式进行表单验证的工具类
 * 提供邮箱、手机、固话、传真和QQ号码的格式验证功能
 */
public class RegexValidateUtils {

    // 预编译正则表达式模式，提高性能
    private static final Pattern EMAIL_PATTERN = Pattern.compile(
            "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$"
    );

    private static final Pattern CELLPHONE_PATTERN = Pattern.compile(
            "^1[3-9]\\d{9}$"
    );

    private static final Pattern TELEPHONE_PATTERN = Pattern.compile(
            "^(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)$"
    );

    private static final Pattern FAX_PATTERN = Pattern.compile(
            "^(0\\d{2}-\\d{8}(-\\d{1,4})?)|(0\\d{3}-\\d{7,8}(-\\d{1,4})?)$"
    );

    private static final Pattern QQ_PATTERN = Pattern.compile(
            "^[1-9]\\d{4,}$"
    );

    /**
     * 验证邮箱格式
     *
     * @param email 待验证的邮箱地址
     * @return 如果格式合法返回true，否则返回false
     */
    public static boolean checkEmail(String email) {
        if (email == null || email.isEmpty()) {
            return false;
        }
        return EMAIL_PATTERN.matcher(email).matches();
    }

    /**
     * 验证手机号码格式
     * 支持最新的手机号码段
     *
     * @param cellphone 待验证的手机号码
     * @return 如果格式合法返回true，否则返回false
     */
    public static boolean checkCellphone(String cellphone) {
        if (cellphone == null || cellphone.isEmpty()) {
            return false;
        }
        return CELLPHONE_PATTERN.matcher(cellphone).matches();
    }

    /**
     * 验证固话号码格式
     * 支持带区号和分机号的格式
     *
     * @param telephone 待验证的固话号码
     * @return 如果格式合法返回true，否则返回false
     */
    public static boolean checkTelephone(String telephone) {
        if (telephone == null || telephone.isEmpty()) {
            return false;
        }
        return TELEPHONE_PATTERN.matcher(telephone).matches();
    }

    /**
     * 验证传真号码格式
     * 传真号码格式通常与固话相同
     *
     * @param fax 待验证的传真号码
     * @return 如果格式合法返回true，否则返回false
     */
    public static boolean checkFax(String fax) {
        if (fax == null || fax.isEmpty()) {
            return false;
        }
        return FAX_PATTERN.matcher(fax).matches();
    }

    /**
     * 验证QQ号码格式
     * QQ号码通常为5-13位数字，且不以0开头
     *
     * @param qq 待验证的QQ号码
     * @return 如果格式合法返回true，否则返回false
     */
    public static boolean checkQQ(String qq) {
        if (qq == null || qq.isEmpty()) {
            return false;
        }
        return QQ_PATTERN.matcher(qq).matches();
    }
}